package cn.imokay.garbageCollection;

/**
 * 1.可达性算法没有找到与GC Roots的引用链,进行第一次标记
 * 2.刷选是否有必要执行finalize方法(有必要执行的情况:重写了finalize方法,并且没有被执行过)
 * 3.第二次标记时,如果发现了引用链则会被移除将要回收的集合,否则进行回收
 */
public class FinalizeEscapeGC {
    public static FinalizeEscapeGC SAVE_HOOK = null;

    @Override
    protected void finalize() throws Throwable {
        super.finalize();
        System.out.println("finalize被执行,尝试进行自救");
        SAVE_HOOK = this;
    }

    public static void main(String[] args) throws InterruptedException {
        SAVE_HOOK = new FinalizeEscapeGC();

        //去掉引用,使不可达
        SAVE_HOOK = null;

        //手动GC
        System.gc();

        //finalize方法优先级低,睡1秒等待执行
        Thread.sleep(1000);

        if (SAVE_HOOK != null) {
            System.out.println("i am alive");
        }else {
            System.out.println("i am dead !!!");
        }

        //下面这段代码跟上面一样,但是finalize方法指挥执行一次,第二次不会执行,自救失败
        //去掉引用,使不可达
        SAVE_HOOK = null;

        //手动GC
        System.gc();

        //finalize方法优先级低,睡1秒等待执行
        Thread.sleep(1000);

        if (SAVE_HOOK != null) {
            System.out.println("i am alive");
        }else {
            System.out.println("i am dead !!!");
        }

    }
}
